# 在函数内部，可以调用其他函数。如果一个函数在内部调用自身本身，这个函数就是递归函数。
# fact(n) = n! = 1 x 2 x 3 x ... x (n-1) x n = (n-1)! x n = fact(n-1) x n


def fact(n):
    if n == 1:
        return 1
    return n * fact(n - 1)


print(fact(5))
print(fact(10))


# 使用递归函数需要注意防止栈溢出 print(fact(1000))
# 解决递归调用栈溢出的方法是通过尾递归优化
# 尾递归是指，在函数返回的时候，调用自身本身，并且，return语句不能包含表达式。这样，编译器或者解释器就可以把尾递归做优化
def fact_itor(num, member):
    if num == 1:
        return member
    return fact_itor(num - 1, num * member)


print(fact_itor(5, 1))
